python是一種相當適合新手學習也相當適合高手使用的語言
具有簡單的語法跟結構,同時又具有相當多的函式庫可以做各種想得到跟想不到的事
想寫AI,有
想寫大數據,有
想寫網站,有
所以如果只是想學程式卻還沒有想好想做什麼的人很適合學python,
因為不管未來你想做什麼,都可以用上他
python目前分為2.X跟3.X兩種版本,
許多linux都已經有內建好python了,想確認你的linux預裝的版本可以使用以下的指令
python --version
但是由於python2.X的版本已經棄用了,
因此以下會使用python3做介紹
如果還沒有安裝的人可以先去這裡安裝
我在這裡等你,
其他已經有安裝好的學員們我們繼續往下看吧
首先,我會已經預設你已經學會十六進位與十進位的轉換,
並且基本了解程式語言在做什麼了,
還沒學過或蹺課的可以先去看昨天跟前天的主題C#
準備好之後就先在你的工作目錄建立一個附檔名為.py的檔案吧(檔名可以隨便取)
用VScode開啟後在裡面貼上下面的程式碼
import math
# 定義開始
def t2h(number):
num = int(number)
for i in range(16):
for j in range(16):
for k in range(16):
if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:
print(returnAE(i)+returnAE(j)+returnAE(k))
def returnAE(input):
if input<10:
return str(input)
elif input==10:
return "A"
elif input==11:
return "B"
elif input==12:
return "C"
elif input==13:
return "D"
elif input==14:
return "E"
elif input==15:
return "F"
else:
return "wrong"
def h2t(number):
output = 0
pow = len(number)
i = 0
while i < pow:
output += int(AEreturn(number[i])*math.pow(16,pow-i-1))
i+=1
print(output)
def AEreturn(input):
try :
return int(input)
except:
if input=="A":
return 10
elif input=="B":
return 11
elif input=="C":
return 12
elif input=="D":
return 13
elif input=="E":
return 14
elif input=="F":
return 15
else:
return 0
# 程式開始
print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")
if convert == "1":
number = input("Please enter the number\n")
t2h(number)
elif convert == "2":
number = input("Please enter the number\n")
h2t(number)
else:
print("Wrong select")
然後你就可以用
python convert.py
來執行看看
好,先停 可以告訴我main方法跑哪去了嗎?
不是說程式語言會從main方法開始?
C#從main方法當作進入點是因為C#是一種編譯式的語言,而python則是直譯式的語言
兩者最大的差異在於直譯式會從第一行開始執行,而編譯式則會從程式設定好的進入點開始
另外一種差別在於編譯式語言會先編譯後才能執行,而直譯式語言則可以直接執行
蛤? 可是昨天的C#也是直接開始執行阿
那是因為dotnet Core幫你處理掉了,明天我們會介紹Java,到時會更明顯,現在我們就先不提
;呢? 怎麼都沒看到
python是一種不需要;的語言
所以你不必再像C#那樣擔心自己某一行忘記加;而程式跑不起來的窘境
往下看到這兩行
print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")
從這裡就可以看出python簡單的理由了吧
輸入跟輸出直接使用 print 跟 input簡單粗暴
等一下,讀取輸入時不需要指定型別嗎?
不需要,這是由於python是動態型別語言
變數的型別是在執行時才去做定義,而不是編譯時(畢竟python不需要編譯)
因此只有當執行到convert那一行的時候才會確定convert到底是什麼型別,而 = 右邊的input將會告訴他
所以大部分的情況下不需要事先定義變數的型別
這邊要注意輸出字串的最後兩個字
\n
這個是換行符號,告訴python這行結束後要換行
你可以把\n拿掉後執行看看會發生什麼事
我們往下看邏輯處理的部份
if convert == "1":
number = input("Please enter the number\n")
t2h(number)
elif convert == "2":
number = input("Please enter the number\n")
h2t(number)
else:
print("Wrong select")
python內是沒有switch的喔,請用if else判斷吧
python的else if 被簡寫成elif
跟C#不一樣if條件不需要使用()包起來,也不需要使用{}告訴程式我們要執行的範圍
改用:跟縮排指定
縮排?
縮排我們大部分都是使用tab鍵,在你的VScode右下角應該可以看到Space:4
那代表tab的寬度是四個空白鍵
在遇到下一個與自己相同的縮排(或是自己上一層的縮排)前,都是自己這個縮排的範圍
在python內掌控tab算是蠻重要的一環
if的其他部份跟C#類似就不提拉
下一行程式碼
t2h(number)
這個是我們的方法的使用,往上拉到我們程式裡面定義t2h方法的位置吧
def t2h(number):
num = int(number)
for i in range(16):
for j in range(16):
for k in range(16):
if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:
print(returnAE(i)+returnAE(j)+returnAE(k))
python內定義方法的關鍵字是def
結構大致上長這樣
def 方法名稱(輸入值):
由於是動態型別,因此不像C#需要指定輸入值與回傳值的型別
因此如果你只看方法的第一行,你甚至看不出來這個方法到底有沒有回傳值
注意,雖然python是動態型別,但是並不是弱型別的語言(也就是直譯器或編譯器不會幫你自動轉型),
因此當我們需要將這個字串與計算的數值做比較時就需要使用轉型
所以我們有了這一行
num = int(number)
這樣就可以將字串轉型成整數,如此一來就可以跟數值進行比對
for i in range(16):
for j in range(16):
for k in range(16):
很酷吧? 比起C#的for迴圈更容易讓人讀懂總共會輪迴多少次
而且如果在()內放入陣列的話還會自動去遍歷整個陣列(簡單來說就是把陣列從第0個拿到最後一個)
如果你需要其他的算法可以這樣使用
for i in range(10, 1, -2):
#10 8 6 4 2
for i in range(1,10):
#1 2 3 4 5 6 7 8 9
往下看到 if 裡面的這一行
if math.pow(16,2)*i+math.pow(16,1)*j+math.pow(16,0)*k == num:
這邊我們用到了函式庫math,於是我們必須在程式的一開頭將他引用進來
import math
有注意到C#的using跟python的import的差異嗎?
C#內我們說過using後你就可以省略using的語句
using System; //使用了這個之後你就可以省略System.Console.WriteLine的System了
但是python的邏輯不同,import比較像是提醒程式我們需要用到這個函式庫請他幫我們先準備好
所以當你在使用import的語句後還是需要打出import的詞(也就是math)
C#的Using是命名空間,而python的import是引用函式庫
接著跟C#一樣我們必須把得到的 ijk 轉成十六進位的符號
所以我們來到了
def returnAE(input):
if input<10:
return str(input)
elif input==10:
return "A"
elif input==11:
return "B"
elif input==12:
return "C"
elif input==13:
return "D"
elif input==14:
return "E"
elif input==15:
return "F"
else:
return "wrong"
同樣的因為沒有switch因此我們只能慢慢來一個一個判斷
注意到這裡
return str(input)
記得這裡要轉型喔,雖然因為動態型別的關係在這邊可以回傳int,
但是到
print(returnAE(i)+returnAE(j)+returnAE(k))
時python會因為你回傳的是int導致 + 時會使用int的相加而不是字串的相加
舉個簡單的例子
當你今天回傳"A","B","C"時,會使用字串的相加而變成"ABC"
但是如果你今天回傳的是2,8,7卻會變成17,
所以你得回傳"2","8","7"
這樣子可以理解了嗎?
往下看到將十六進位轉成十進位的方法吧
def h2t(number):
output = 0
pow = len(number)
i = 0
while i < pow:
output += int(AEreturn(number[i])*math.pow(16,pow-i-1))
i+=1
print(output)
基本上前三行的宣告方式都跟C#一樣,只是不用指定型別
之後的while雖然沒有使用()跟{},但是有:來明確規範哪段是條件句哪段是執行句
注意到執行句裡頭 int( ) 的轉型,轉型的目標是
AEreturn(number[i])*math.pow(16,pow-i-1)
這一整段
這是為了要確保輸出時沒有小數點,
如果不使用的話程式效果會一樣,差別只在於輸出時的格式
詳細的情形就請大家自己試試看拉
python一樣有錯誤處理喔,只是語法不太一樣
def AEreturn(input):
try :
return int(input)
except:
if input=="A":
return 10
elif input=="B":
return 11
elif input=="C":
return 12
elif input=="D":
return 13
elif input=="E":
return 14
elif input=="F":
return 15
else:
return 0
最後介紹一下python的註解
# 定義開始
python的單行註解是使用#
如果你需要多行註解可以使用三個"或三個'
'''
這是註解喔!
這是註解喔!
這是註解喔!
'''
print("Tell me what you want to do:")
convert = input("(1)T to H (2)H to T\n")
我們先複習一下今天學的內容吧
這樣就介紹完python的基本語法了,相較於C#是不是簡單許多?
這也是為什麼python被稱為最適合新手學習的語言了
為什麼不在一開始介紹呢?
理由是因為我想介紹型別,但是動態型別的語言沒辦法確實的介紹這部份
也沒辦法介紹程式語言的結構
另外要注意的部份是根據python直譯器的不同可能會有在A電腦上可執行在B電腦上卻失敗的情況
比方說你的程式長這樣
有可能會直接報錯,理由在於當程式執行到t2h時,你還沒有define t2h()的方法
(還記得我說過直譯式語言是一行一行執行的嗎?)
所以我才會把call t2h的程式放在最下面
但是某些線上的python直譯器這樣做是可行的,理由在於他會把程式先loading起來
而我們的本機不會這麼做
欸? 那為什麼t2h()去call returnAE是可行的?
這方面我沒有資料,我猜跟def有關
如果有其他人知道麻煩在下面留言回覆我
明天我們回到編譯式語言,介紹一個你可能在認識程式語言前就認識的程式語言:JAVA
如果有任何寫不清楚或是觀念沒有很明白的話請留言告知我
會盡快補上
如果有任何寫錯的地方也麻煩留言告知我
會盡快修正
感謝各位